// 从 NestJS 公共模块导入 Module 装饰器，用于定义 NestJS 模块
import { Module } from '@nestjs/common';
// 从 NestJS TypeORM 模块导入 TypeOrmModule，用于集成 TypeORM 数据库功能
import { TypeOrmModule } from '@nestjs/typeorm';
// 从 NestJS 配置模块导入 ConfigModule 和 ConfigService，用于管理配置项
import { ConfigModule, ConfigService } from '@nestjs/config';
// 导入用户实体
import { User } from '../users/entities/user.entity';
// 导入帖子实体
import { Post } from '../posts/entities/post.entity';

/**
 * 数据库模块，负责配置和初始化数据库连接
 */
@Module({
  // 导入其他模块，使当前模块可以使用这些模块提供的功能
  imports: [
    // 全局配置模块，设置为全局模块后，其他模块无需再次导入即可使用
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    // 异步配置 TypeORM 连接
    TypeOrmModule.forRootAsync({
      // 导入配置模块，以便在工厂函数中使用 ConfigService
      imports: [ConfigModule],
      // 工厂函数，返回 TypeORM 配置对象
      useFactory: (configService: ConfigService) => ({ 
        // 数据库类型为 MySQL
        type: 'mysql',
        // 从配置中获取数据库主机地址
        host: configService.get('DB_HOST'),
        // 从配置中获取数据库端口号，并转换为数字类型
        port: +configService.get('DB_PORT'),
        // 从配置中获取数据库用户名
        username: configService.get('DB_USERNAME'),
        // 从配置中获取数据库密码
        password: configService.get('DB_PASSWORD'),
        // 从配置中获取数据库名称
        database: configService.get('DB_NAME'),
        // 注册数据库实体
        entities: [User, Post],
        // 开发环境下自动同步数据库表结构，生产环境建议关闭
        synchronize: true,
      }),
      // 注入 ConfigService 供工厂函数使用
      inject: [ConfigService],
    }),
  ],
})
export class DatabaseModule {}